﻿Imports System.Data.OleDb
Imports System.Text.RegularExpressions

Public Class clsFacture

#Region "attributs"

    Private _noFacture As Integer
    Private _sousTotal As Double
    Private _tps As Double
    Private _tvq As Double
    Private _actif As Boolean
    Private _noCarte As String
    Private _dateExpirationCarte As Date
    Private _modePaiement As String

#End Region

#Region "constructeurs"

    '********************************************************************************
    ' But:  Initialiser une nouvelle facture et, donc, lui attribuer un numéro unique
    '********************************************************************************
    Public Sub New()
        'créé un numéro de catégorie unique pour la nouvelle facture
        Dim bd = New cls_GestionBD("taco.mdb")
        bd.remplirDataSet("SELECT MAX(noFacture) AS noMaximum FROM tblFactures", "tbl")

        _noFacture = nvl(bd.dsBd.Tables("tbl").Rows(0).Item("noMaximum"), 0) + 1
        sousTotal = 0
        tps = 0
        tvq = 0
        actif = True
        noCarte = ""
        dateExpirationCarte = FormatDateTime(Now, DateFormat.ShortDate)
        modePaiement = "Comptant"

    End Sub

    '********************************************************************************
    ' But:  Initialiser une facture à partir des ses informations provenant de la base de données
    ' Paramètres:
    '   row:    Enregistrement résultant d'une requête SELECT * FROM tbl
    '********************************************************************************
    Public Sub New(ByVal row As DataRow)
        With row
            _noFacture = nvl(.Item("noFacture"), 0)
            sousTotal = nvl(.Item("sousTotal"), 0)
            tps = nvl(.Item("tps"), 0)
            tvq = nvl(.Item("tvq"), 0)
            actif = nvl(.Item("actif"), True)
            noCarte = nvl(.Item("noCarte"), "")
            dateExpirationCarte = nvl(.Item("dateExpirationCarte"), Now)
            modePaiement = nvl(.Item("modePaiement"), "Comptant")
        End With
    End Sub

#End Region

#Region "get/set"

    ReadOnly Property noFacture() As Integer
        Get
            Return _noFacture
        End Get
    End Property

    Property sousTotal() As Object
        Get
            Return _sousTotal
        End Get
        Set(ByVal value As Object)

            Try

                ' convertit le paramètre dans le bon type
                value = CInt(value)

                ' vérifie si le paramètre respecte les spécifications
                If value >= 0 Then
                    _sousTotal = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: Le sous-total doit être un nombre plus grand ou égale à zéro." & vbCrLf & _
                       "La valeur << 0 >> sera utilisé en remplacement.")
                _sousTotal = 0
            End Try

        End Set
    End Property

    Property tps() As Object
        Get
            Return _tps
        End Get
        Set(ByVal value As Object)

            Try

                ' convertit le paramètre dans le bon type
                value = CInt(value)

                ' vérifie si le paramètre respecte les spécifications
                If value >= 0 Then
                    _tps = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: La TPS doit être un nombre plus grand ou égale à zéro." & vbCrLf & _
                       "La valeur << 0 >> sera utilisé en remplacement.")
                _tps = 0
            End Try

        End Set
    End Property

    Property tvq() As Object
        Get
            Return _tvq
        End Get
        Set(ByVal value As Object)

            Try

                ' convertit le paramètre dans le bon type
                value = CInt(value)

                ' vérifie si le paramètre respecte les spécifications
                If value >= 0 Then
                    _tvq = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: La TVQ doit être un nombre plus grand ou égale à zéro." & vbCrLf & _
                       "La valeur << 0 >> sera utilisé en remplacement.")
                _tvq = 0
            End Try

        End Set
    End Property

    Property actif() As Object
        Get
            Return _actif
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon format
                value = CBool(value)

                _actif = value

            Catch ex As Exception
                MsgBox("ERREUR: La valeur de actif peut être soit << True >> ou << False >>." & vbCrLf & _
                       "La valeur de actif << True >> sera utilisé en remplacement.")
                _actif = ""
            End Try

        End Set
    End Property

    Property noCarte() As Object
        Get
            Return _noCarte
        End Get
        Set(ByVal value As Object)

            Try
                ' convertit le paramètre dans le bon type
                value = CStr(value)

                'vérifie si le paramètre respecte les spécifications
                Dim regNoCarteDepot As New Regex("^([4]{1})([0-9]{12,15})$")

                If regNoCarteDepot.IsMatch(value) Or value.Length = 0 Then
                    _noCarte = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: Le numéro de carte doit être une chaine de caractères 13 à 16 caractères et commencant par un << 4 >>." & vbCrLf & _
                       "Le numéro de carte << >> sera utilisé en remplacement.")
                _noCarte = ""
            End Try

        End Set
    End Property

    Property dateExpirationCarte() As Object
        Get
            Return _dateExpirationCarte
        End Get
        Set(ByVal value As Object)

            Try

                'convertit le paramètre dans le bon type
                value = CDate(value)

                _dateExpirationCarte = value

            Catch ex As Exception
                MsgBox("ERREUR: La date d'expiration de la carte doit être plus grande ou égale à la date actuelle." & _
                       "La date << " & FormatDateTime(Now, DateFormat.ShortDate) & ">> sera utilisé en remplacement.")
                _dateExpirationCarte = FormatDateTime(Now, DateFormat.ShortDate)
            End Try

        End Set
    End Property

    Property modePaiement() As Object
        Get
            Return _modePaiement
        End Get
        Set(ByVal value As Object)

            Try

                ' convertit le paramètre dans le bon type
                value = CStr(value)

                Dim regModePaiement As New Regex("^(Comptant|Carte de crédit|Carte de débit)$")

                'vérifie si le paramètre respecte les spécifications
                If regModePaiement.IsMatch(value) Then
                    _modePaiement = value
                Else
                    Throw New Exception
                End If

            Catch ex As Exception
                MsgBox("ERREUR: Le mode de paiement doit être une chaine de caractères." & vbCrLf & _
                       "Le mode de paiement << Comptant >> sera utilisé en remplacement.")
                _modePaiement = "Comptant"
            End Try

        End Set
    End Property



#End Region

#Region "méthodes"

    '********************************************************************************
    ' But:  Enregistrer la facture dans la base de données
    '********************************************************************************
    Public Sub enregistrer()
        'importe le véhicule de la base de données
        Dim bd As New cls_GestionBD("taco.mdb")
        bd.daBd.SelectCommand = New OleDbCommand("SELECT * FROM tblFactures where noFacture = @numero")
        bd.daBd.SelectCommand.Parameters.Add("@numero", OleDbType.Integer).Value = noFacture
        bd.remplirDataSet("tbl")

        'met à jour la facture si elle existe déjà dans la base de données
        If bd.dsBd.Tables("tbl").Rows.Count = 1 Then
            With bd.dsBd.Tables("tbl").Rows(0)
                .Item("noFacture") = _noFacture
                .Item("sousTotal") = sousTotal
                .Item("tps") = tps
                .Item("tvq") = tvq
                .Item("actif") = actif
                .Item("noCarte") = noCarte
                .Item("dateExpirationCarte") = dateExpirationCarte
                .Item("modePaiement") = modePaiement
            End With

            'créé un nouvel enregistrement si la facture n'existe pas encore dans la base de données
        ElseIf bd.dsBd.Tables("tbl").Rows.Count = 0 Then

            Dim lNewRow As DataRow
            lNewRow = bd.dsBd.Tables("tbl").NewRow

            With lNewRow
                .Item("noFacture") = _noFacture
                .Item("sousTotal") = sousTotal
                .Item("tps") = tps
                .Item("tvq") = tvq
                .Item("actif") = actif
                .Item("noCarte") = noCarte
                .Item("dateExpirationCarte") = dateExpirationCarte
                .Item("modePaiement") = modePaiement
            End With

            bd.dsBd.Tables("tbl").Rows.Add(lNewRow)

        End If

        'met à jour la base de données
        bd.miseAJourBD("tbl")
    End Sub

    '********************************************************************************
    ' But:  Supprimer la facture de la base de données
    '********************************************************************************
    Public Sub supprimer()
        'importe la facture de la base de données
        Dim bd As New cls_GestionBD("taco.mdb")
        bd.daBd.SelectCommand = New OleDbCommand("SELECT * FROM tblFactures where noFacture = @numero")
        bd.daBd.SelectCommand.Parameters.Add("@numero", OleDbType.Integer).Value = noFacture
        bd.remplirDataSet("tbl")

        'supprime la facture si elle existe dans la base de données, sinon, affiche un message d'erreur
        If bd.dsBd.Tables("tbl").Rows.Count = 1 Then
            bd.dsBd.Tables("tbl").Rows(0).Delete()
        ElseIf bd.dsBd.Tables("tbl").Rows.Count = 0 Then
            MsgBox("ERREUR: La facture n'existe pas dans la base de données." & vbCrLf & _
                   "Il est donc impossible de la supprimer.")
        End If

        'met à jour la base de données
        bd.miseAJourBD("tbl")

    End Sub

    '********************************************************************************
    ' But:  Afficher tous les attributs de la facture
    ' Return:   Une chaine de caractère contenant chaque attribut accompagné de sa valeur
    '********************************************************************************
    Public Overrides Function ToString() As String
        Dim reponse As String = "noVehicule:" & vbTab & noVehicule & vbCrLf & _
                "noFacture:" & vbTab & noFacture & vbCrLf & _
                "sousTotal:" & vbTab & sousTotal & vbCrLf & _
                "tps:" & vbTab & tps & vbCrLf & _
                "tvq:" & vbTab & tvq & vbCrLf & _
                "actif:" & vbTab & actif & vbCrLf & _
                "noCarte:" & vbTab & noCarte & vbCrLf & _
                "dateExpirationCarte:" & vbTab & dateExpirationCarte & vbCrLf & _
                "modePaiement:" & vbTab & modePaiement

        Return reponse
    End Function

#End Region

End Class
